接口和抽象类是很多设计模式、设计思想、设计原则编程实现的基础。
抽象类
- 不允许被实例化
- 抽象类包含属性和方法。其中方法可以包含代码实现,也可以不包含代码实现(抽象方法)
- 子类集成抽象类。子类必须实现抽象类的抽象方法。
接口类
- 接口不能包含属性(成员变量)
- 接口只能声明方法,方法不能包含方法实现
- 类实现接口的时候,必须实现接口的所有方法。
抽象类与接口类的区别
- 抽象类的本质是类,主要只能被子类去继承,体现着is-a的继承关系
- 接口类表示一种has-a的关系,体现具有某些功能,表现为一种约定和协议。
抽象类和接口类能解决什么问题
抽象类
- 代码复用,避免在子类中编写相同的代码
同样是代码复用,为什么不直接用继承,而要使用抽象类来实现?相比继承来说,抽象类的实现更加的优雅
- 父类中定义一个被子类继承的无意义的log()方法会使代码的可读性变差。
- 创建子类的时候,会忘记重写log()。然而抽象类会强制子类实现。
- 继承中,父类是可以被实例化的,我们可以调用空的log()方法,会增加类误用的风险。(可以通过设置私有构造函数解决)
接口类
侧重于解耦。对行为进行抽象,之关系接口的协议,不关心具体实现,实现约定与实现相分离。
模拟接口类和抽象类
模拟接口类
普通类模拟接口类
- protect访问权限,避免类被实例化
- 不含具体实现的方法
1 | public class MockInteface { |
抽象类和接口类的使用
- 抽象类:is-a的关系,解决代码复用的问题
- 接口类:has-a的关系,解决耦合的问题,表示一组行为特征,隔离接口和具体实现